package com.supermarket.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * JWT工具类
 * 用于生成和验证JWT token
 */
@Component
public class JwtUtil {
    
    // token有效期（2小时）
    public static final long JWT_TOKEN_VALIDITY = 2 * 60 * 60 * 1000;
    
    // 签名密钥（实际项目中应该放在配置文件中，通过环境变量或其他安全方式提供）
    private final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
    
    /**
     * 从token中获取用户ID
     */
    public Integer getUserIdFromToken(String token) {
        String userId = getClaimFromToken(token, claims -> claims.get("userId", String.class));
        return userId != null ? Integer.parseInt(userId) : null;
    }
    
    /**
     * 从token中获取用户角色
     */
    public String getRoleFromToken(String token) {
        return getClaimFromToken(token, claims -> claims.get("role", String.class));
    }
    
    /**
     * 获取token的过期时间
     */
    public Date getExpirationDateFromToken(String token) {
        return getClaimFromToken(token, Claims::getExpiration);
    }
    
    /**
     * 从token中获取指定的声明
     */
    public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = getAllClaimsFromToken(token);
        return claimsResolver.apply(claims);
    }
    
    /**
     * 解析token获取所有声明
     */
    private Claims getAllClaimsFromToken(String token) {
        return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
    }
    
    /**
     * 检查token是否过期
     */
    private Boolean isTokenExpired(String token) {
        final Date expiration = getExpirationDateFromToken(token);
        return expiration.before(new Date());
    }
    
    /**
     * 为用户生成token
     */
    public String generateToken(Integer userId, String role) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId.toString());
        claims.put("role", role);
        return doGenerateToken(claims);
    }
    
    /**
     * 生成token
     */
    private String doGenerateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY))
                .signWith(key)
                .compact();
    }
    
    /**
     * 验证token
     */
    public Boolean validateToken(String token) {
        // 只检查token是否过期
        return !isTokenExpired(token);
    }
} 
 